@@ -60,6 +60,7 @@ group :test do |
||
60 | 60 |
gem 'cucumber-rails', :require => false |
61 | 61 |
gem 'database_cleaner' |
62 | 62 |
gem "factory_girl_rails", "~> 4.0", :require => false |
63 |
+ gem 'email_spec' |
|
63 | 64 |
end |
64 | 65 |
|
65 | 66 |
# Use ActiveModel has_secure_password |
@@ -72,6 +72,9 @@ GEM |
||
72 | 72 |
thread_safe (~> 0.1) |
73 | 73 |
warden (~> 1.2.3) |
74 | 74 |
diff-lcs (1.2.5) |
75 |
+ email_spec (1.6.0) |
|
76 |
+ launchy (~> 2.1) |
|
77 |
+ mail (~> 2.2) |
|
75 | 78 |
erubis (2.7.0) |
76 | 79 |
excon (0.39.5) |
77 | 80 |
execjs (2.2.1) |
@@ -263,6 +266,7 @@ DEPENDENCIES |
||
263 | 266 |
cucumber-rails |
264 | 267 |
database_cleaner |
265 | 268 |
devise |
269 |
+ email_spec |
|
266 | 270 |
factory_girl_rails (~> 4.0) |
267 | 271 |
figaro |
268 | 272 |
flatstrap-rails |
@@ -0,0 +1,206 @@ |
||
1 |
+# Commonly used email steps |
|
2 |
+# |
|
3 |
+# To add your own steps make a custom_email_steps.rb |
|
4 |
+# The provided methods are: |
|
5 |
+# |
|
6 |
+# last_email_address |
|
7 |
+# reset_mailer |
|
8 |
+# open_last_email |
|
9 |
+# visit_in_email |
|
10 |
+# unread_emails_for |
|
11 |
+# mailbox_for |
|
12 |
+# current_email |
|
13 |
+# open_email |
|
14 |
+# read_emails_for |
|
15 |
+# find_email |
|
16 |
+# |
|
17 |
+# General form for email scenarios are: |
|
18 |
+# - clear the email queue (done automatically by email_spec) |
|
19 |
+# - execute steps that sends an email |
|
20 |
+# - check the user received an/no/[0-9] emails |
|
21 |
+# - open the email |
|
22 |
+# - inspect the email contents |
|
23 |
+# - interact with the email (e.g. click links) |
|
24 |
+# |
|
25 |
+# The Cucumber steps below are setup in this order. |
|
26 |
+ |
|
27 |
+module EmailHelpers |
|
28 |
+ def current_email_address |
|
29 |
+ # Replace with your a way to find your current email. e.g @current_user.email |
|
30 |
+ # last_email_address will return the last email address used by email spec to find an email. |
|
31 |
+ # Note that last_email_address will be reset after each Scenario. |
|
32 |
+ last_email_address || "example@example.com" |
|
33 |
+ end |
|
34 |
+end |
|
35 |
+ |
|
36 |
+World(EmailHelpers) |
|
37 |
+ |
|
38 |
+# |
|
39 |
+# Reset the e-mail queue within a scenario. |
|
40 |
+# This is done automatically before each scenario. |
|
41 |
+# |
|
42 |
+ |
|
43 |
+Given /^(?:a clear email queue|no emails have been sent)$/ do |
|
44 |
+ reset_mailer |
|
45 |
+end |
|
46 |
+ |
|
47 |
+# |
|
48 |
+# Check how many emails have been sent/received |
|
49 |
+# |
|
50 |
+ |
|
51 |
+Then /^(?:I|they|"([^"]*?)") should receive (an|no|\d+) emails?$/ do |address, amount| |
|
52 |
+ unread_emails_for(address).size.should == parse_email_count(amount) |
|
53 |
+end |
|
54 |
+ |
|
55 |
+Then /^(?:I|they|"([^"]*?)") should have (an|no|\d+) emails?$/ do |address, amount| |
|
56 |
+ mailbox_for(address).size.should == parse_email_count(amount) |
|
57 |
+end |
|
58 |
+ |
|
59 |
+Then /^(?:I|they|"([^"]*?)") should receive (an|no|\d+) emails? with subject "([^"]*?)"$/ do |address, amount, subject| |
|
60 |
+ unread_emails_for(address).select { |m| m.subject =~ Regexp.new(Regexp.escape(subject)) }.size.should == parse_email_count(amount) |
|
61 |
+end |
|
62 |
+ |
|
63 |
+Then /^(?:I|they|"([^"]*?)") should receive (an|no|\d+) emails? with subject \/([^"]*?)\/$/ do |address, amount, subject| |
|
64 |
+ unread_emails_for(address).select { |m| m.subject =~ Regexp.new(subject) }.size.should == parse_email_count(amount) |
|
65 |
+end |
|
66 |
+ |
|
67 |
+Then /^(?:I|they|"([^"]*?)") should receive an email with the following body:$/ do |address, expected_body| |
|
68 |
+ open_email(address, :with_text => expected_body) |
|
69 |
+end |
|
70 |
+ |
|
71 |
+# |
|
72 |
+# Accessing emails |
|
73 |
+# |
|
74 |
+ |
|
75 |
+# Opens the most recently received email |
|
76 |
+When /^(?:I|they|"([^"]*?)") opens? the email$/ do |address| |
|
77 |
+ open_email(address) |
|
78 |
+end |
|
79 |
+ |
|
80 |
+When /^(?:I|they|"([^"]*?)") opens? the email with subject "([^"]*?)"$/ do |address, subject| |
|
81 |
+ open_email(address, :with_subject => subject) |
|
82 |
+end |
|
83 |
+ |
|
84 |
+When /^(?:I|they|"([^"]*?)") opens? the email with subject \/([^"]*?)\/$/ do |address, subject| |
|
85 |
+ open_email(address, :with_subject => Regexp.new(subject)) |
|
86 |
+end |
|
87 |
+ |
|
88 |
+When /^(?:I|they|"([^"]*?)") opens? the email with text "([^"]*?)"$/ do |address, text| |
|
89 |
+ open_email(address, :with_text => text) |
|
90 |
+end |
|
91 |
+ |
|
92 |
+When /^(?:I|they|"([^"]*?)") opens? the email with text \/([^"]*?)\/$/ do |address, text| |
|
93 |
+ open_email(address, :with_text => Regexp.new(text)) |
|
94 |
+end |
|
95 |
+ |
|
96 |
+# |
|
97 |
+# Inspect the Email Contents |
|
98 |
+# |
|
99 |
+ |
|
100 |
+Then /^(?:I|they) should see "([^"]*?)" in the email subject$/ do |text| |
|
101 |
+ current_email.should have_subject(text) |
|
102 |
+end |
|
103 |
+ |
|
104 |
+Then /^(?:I|they) should see \/([^"]*?)\/ in the email subject$/ do |text| |
|
105 |
+ current_email.should have_subject(Regexp.new(text)) |
|
106 |
+end |
|
107 |
+ |
|
108 |
+Then /^(?:I|they) should see "([^"]*?)" in the email body$/ do |text| |
|
109 |
+ current_email.default_part_body.to_s.should include(text) |
|
110 |
+end |
|
111 |
+ |
|
112 |
+Then /^(?:I|they) should see \/([^"]*?)\/ in the email body$/ do |text| |
|
113 |
+ current_email.default_part_body.to_s.should =~ Regexp.new(text) |
|
114 |
+end |
|
115 |
+ |
|
116 |
+Then /^(?:I|they) should see the email delivered from "([^"]*?)"$/ do |text| |
|
117 |
+ current_email.should be_delivered_from(text) |
|
118 |
+end |
|
119 |
+ |
|
120 |
+Then /^(?:I|they) should see "([^\"]*)" in the email "([^"]*?)" header$/ do |text, name| |
|
121 |
+ current_email.should have_header(name, text) |
|
122 |
+end |
|
123 |
+ |
|
124 |
+Then /^(?:I|they) should see \/([^\"]*)\/ in the email "([^"]*?)" header$/ do |text, name| |
|
125 |
+ current_email.should have_header(name, Regexp.new(text)) |
|
126 |
+end |
|
127 |
+ |
|
128 |
+Then /^I should see it is a multi\-part email$/ do |
|
129 |
+ current_email.should be_multipart |
|
130 |
+end |
|
131 |
+ |
|
132 |
+Then /^(?:I|they) should see "([^"]*?)" in the email html part body$/ do |text| |
|
133 |
+ current_email.html_part.body.to_s.should include(text) |
|
134 |
+end |
|
135 |
+ |
|
136 |
+Then /^(?:I|they) should see "([^"]*?)" in the email text part body$/ do |text| |
|
137 |
+ current_email.text_part.body.to_s.should include(text) |
|
138 |
+end |
|
139 |
+ |
|
140 |
+# |
|
141 |
+# Inspect the Email Attachments |
|
142 |
+# |
|
143 |
+ |
|
144 |
+Then /^(?:I|they) should see (an|no|\d+) attachments? with the email$/ do |amount| |
|
145 |
+ current_email_attachments.size.should == parse_email_count(amount) |
|
146 |
+end |
|
147 |
+ |
|
148 |
+Then /^there should be (an|no|\d+) attachments? named "([^"]*?)"$/ do |amount, filename| |
|
149 |
+ current_email_attachments.select { |a| a.filename == filename }.size.should == parse_email_count(amount) |
|
150 |
+end |
|
151 |
+ |
|
152 |
+Then /^attachment (\d+) should be named "([^"]*?)"$/ do |index, filename| |
|
153 |
+ current_email_attachments[(index.to_i - 1)].filename.should == filename |
|
154 |
+end |
|
155 |
+ |
|
156 |
+Then /^there should be (an|no|\d+) attachments? of type "([^"]*?)"$/ do |amount, content_type| |
|
157 |
+ current_email_attachments.select { |a| a.content_type.include?(content_type) }.size.should == parse_email_count(amount) |
|
158 |
+end |
|
159 |
+ |
|
160 |
+Then /^attachment (\d+) should be of type "([^"]*?)"$/ do |index, content_type| |
|
161 |
+ current_email_attachments[(index.to_i - 1)].content_type.should include(content_type) |
|
162 |
+end |
|
163 |
+ |
|
164 |
+Then /^all attachments should not be blank$/ do |
|
165 |
+ current_email_attachments.each do |attachment| |
|
166 |
+ attachment.read.size.should_not == 0 |
|
167 |
+ end |
|
168 |
+end |
|
169 |
+ |
|
170 |
+Then /^show me a list of email attachments$/ do |
|
171 |
+ EmailSpec::EmailViewer::save_and_open_email_attachments_list(current_email) |
|
172 |
+end |
|
173 |
+ |
|
174 |
+# |
|
175 |
+# Interact with Email Contents |
|
176 |
+# |
|
177 |
+ |
|
178 |
+When /^(?:I|they|"([^"]*?)") follows? "([^"]*?)" in the email$/ do |address, link| |
|
179 |
+ visit_in_email(link, address) |
|
180 |
+end |
|
181 |
+ |
|
182 |
+When /^(?:I|they) click the first link in the email$/ do |
|
183 |
+ click_first_link_in_email |
|
184 |
+end |
|
185 |
+ |
|
186 |
+# |
|
187 |
+# Debugging |
|
188 |
+# These only work with Rails and OSx ATM since EmailViewer uses RAILS_ROOT and OSx's 'open' command. |
|
189 |
+# Patches accepted. ;) |
|
190 |
+# |
|
191 |
+ |
|
192 |
+Then /^save and open current email$/ do |
|
193 |
+ EmailSpec::EmailViewer::save_and_open_email(current_email) |
|
194 |
+end |
|
195 |
+ |
|
196 |
+Then /^save and open all text emails$/ do |
|
197 |
+ EmailSpec::EmailViewer::save_and_open_all_text_emails |
|
198 |
+end |
|
199 |
+ |
|
200 |
+Then /^save and open all html emails$/ do |
|
201 |
+ EmailSpec::EmailViewer::save_and_open_all_html_emails |
|
202 |
+end |
|
203 |
+ |
|
204 |
+Then /^save and open all raw emails$/ do |
|
205 |
+ EmailSpec::EmailViewer::save_and_open_all_raw_emails |
|
206 |
+end |
@@ -57,5 +57,8 @@ end |
||
57 | 57 |
Cucumber::Rails::Database.javascript_strategy = :truncation |
58 | 58 |
require "#{Rails.root}/spec/factories.rb" |
59 | 59 |
|
60 |
+# Make sure this require is after you require cucumber/rails/world. |
|
61 |
+require 'email_spec' # add this line if you use spork |
|
62 |
+require 'email_spec/cucumber' |
|
60 | 63 |
|
61 | 64 |
|